package com.copsoftware.comun.dao;

import java.util.Collection;
import java.util.Iterator;
import java.util.List;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

import com.copsoftware.comun.beans.PersonaFlt;
import com.copsoftware.comun.interfaces.IPersona;
import com.copsoftware.db.DAOSession;
import com.copsoftware.entity.DenAcusadoImpl;
import com.copsoftware.entity.DenPersonaImpl;
import com.copsoftware.entity.DenPersonalImpl;
import com.copsoftware.entity.DenTestigoImpl;
import com.copsoftware.hibernate.cfg.HibernateUtils;
import com.copsoftware.mantenimientos.persona.beans.PersonaCompletaFlt;
import com.copsoftware.utils.beans.BeanBuilder;
import com.copsoftware.utils.dao.WhereBuilder;
import com.sun.org.apache.bcel.internal.generic.INSTANCEOF;

import com.copsoftware.comun.beans.BeanPersona;;

public class PersonaDAO extends DAOSession {

	protected final Log logger = LogFactory.getLog(getClass());

	public IPersona buscarPersona(PersonaFlt personaFlt) {
		String tipoPersona = personaFlt.getTipoPersona();
		String filtro = personaFlt.getCodigo();
		String cargo = personaFlt.getCargo();
		StringBuffer hql = getHQLFromTipoPersona(tipoPersona);
		hql.append(" where \n");
		hql.append("CPersona=").append(filtro);
		// TODO Agregar filtro para cargos
		logger.info(hql.toString());
		return (IPersona) getSession().createQuery(hql.toString())
				.uniqueResult();
	}

	private StringBuffer getHQLFromTipoPersona(String tipoPersona) {
		StringBuffer hql = new StringBuffer();
		hql.append("from ");
		String tabla = "DenPersonaImpl";
		if (DenPersonaImpl.TIPO_PERSONA_DENUNCIANTE.equals(tipoPersona))
			tabla = "DenTestigoImpl";
		if (DenPersonaImpl.TIPO_PERSONA_ACUSADO.equals(tipoPersona))
			tabla = "DenAcusadoImpl";
		if (DenPersonaImpl.TIPO_PERSONA_PERSONAL.equals(tipoPersona))
			tabla = "DenPersonal";
		hql.append(tabla);
		return hql;
	}

	public void guardarPersona(IPersona persona) {
		getSession().saveOrUpdate(persona);
		getSession().flush();
	}

	public void guardarHijoPersona(IPersona persona) {
		getSession().saveOrUpdate(persona);

	}

	public Collection buscarPersona(PersonaCompletaFlt personaCompletaFlt) {
		String tipoPersona = personaCompletaFlt.getTipoPersona();
		
		StringBuffer hql = getHQLFromTipoPersona(tipoPersona);
		StringBuffer hql2 = new StringBuffer();
		hql2.append("select new map (CPersona as CPersona, XNombre as XNombre, XApellido as XApellido) ");		
		WhereBuilder where = new WhereBuilder(personaCompletaFlt);
		where.registerMatch("CPersona", "CPersona");
		where.registerMatch("XNombre", "XNombre");
		where.registerMatch("XApellido", "XApellido");

		if (DenPersonaImpl.TIPO_PERSONA_ACUSADO.compareTo(Integer.valueOf(tipoPersona))==0) {
			where.registerMatch("CBanda", "CBanda");
			where.registerMatch("XAlias", "XAlias");
		}
		if (DenPersonaImpl.TIPO_PERSONA_PERSONAL.compareTo(Integer.valueOf(tipoPersona))==0) {
			where.registerMatch("CSeccion", "CSeccion");
			where.registerMatch("CCargo", "CCargo ");
		}
		
		if (DenPersonaImpl.TIPO_PERSONA_DENUNCIANTE.compareTo(Integer.valueOf(tipoPersona))==0) {
			where.registerMatch("CSeccion", "CSeccion");
			where.registerMatch("CCargo", "CCargo ");
		}

		where.execute();
		if (where.getParameters() != null)
			hql.append(" where ");
		hql.append(where.getSql());
		hql2.append(hql);
		Collection  col =getSession().createQuery(hql2.toString()).list();
		try {
			return BeanBuilder.procesarFila(col, BeanPersona.class); 
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return null;

	}

	public static void main(String[] args) {
		HibernateUtils.getSessionFactory().getCurrentSession()
				.beginTransaction();
		PersonaCompletaFlt personaCompletaFlt = new PersonaCompletaFlt();
		personaCompletaFlt.setCBanda("1");
		personaCompletaFlt.setCCargo("1");
		personaCompletaFlt.setCPersona("1");
		personaCompletaFlt.setCSeccion("1");
		personaCompletaFlt.setXAlias("Choro");
		personaCompletaFlt.setXApellido("Ape");
		personaCompletaFlt.setCTipoDocumento("2");
		personaCompletaFlt.setNTipoDocumento("1212");
		personaCompletaFlt.setTipoPersona("2");
		PersonaDAO personaDAO = new PersonaDAO();
		personaDAO.setSession(HibernateUtils.getSessionFactory().getCurrentSession());
		Log logger = LogFactory.getLog(PersonaDAO.class);
//		IPersona persona= (IPersona) personaDAO.buscarPersona(personaFlt);
		personaDAO.buscarPersona(personaCompletaFlt);
//		DenTestigoImpl persona = new DenTestigoImpl();
//		persona.setXNombre("Walter");
//		persona.setXApellido("Garcia");
//		personaDAO.guardarPersona(persona);
		HibernateUtils.getSessionFactory().getCurrentSession().getTransaction()
				.commit();
	}

}
